/*
 * contrib/btree_gist/btree_utils_var.h
 */
#ifndef __BTREE_UTILS_VAR_H__
#define __BTREE_UTILS_VAR_H__

#include "btree_gist.h"

#include "access/gist.h"
#include "mb/pg_wchar.h"

/* Variable length key */
typedef bytea GBT_VARKEY;

/* Better readable key */
typedef struct {
    bytea *lower, *upper;
} GBT_VARKEY_R;

/*
 * type description
 */
typedef struct {

    /* Attribs */

    enum gbtree_type t; /* data type */
    int32 eml;          /* cached pg_database_encoding_max_length (0:
                         * undefined) */
    bool trnc;          /* truncate (=compress) key */

    /* Methods */

    bool (*f_gt)(const void*, const void*, Oid);   /* greater than */
    bool (*f_ge)(const void*, const void*, Oid);   /* greater equal */
    bool (*f_eq)(const void*, const void*, Oid);   /* equal */
    bool (*f_le)(const void*, const void*, Oid);   /* less equal */
    bool (*f_lt)(const void*, const void*, Oid);   /* less than */
    int32 (*f_cmp)(const void*, const void*, Oid); /* compare */
    GBT_VARKEY* (*f_l2n)(GBT_VARKEY*);             /* convert leaf to node */
} gbtree_vinfo;

extern GBT_VARKEY_R gbt_var_key_readable(const GBT_VARKEY* k);

extern GBT_VARKEY* gbt_var_key_copy(const GBT_VARKEY_R* u, bool force_node);

extern GISTENTRY* gbt_var_compress(GISTENTRY* entry, const gbtree_vinfo* tinfo);

extern GBT_VARKEY* gbt_var_union(
    const GistEntryVector* entryvec, int32* size, Oid collation, const gbtree_vinfo* tinfo);

extern bool gbt_var_same(Datum d1, Datum d2, Oid collation, const gbtree_vinfo* tinfo);

extern float* gbt_var_penalty(
    float* res, const GISTENTRY* o, const GISTENTRY* n, Oid collation, const gbtree_vinfo* tinfo);

extern bool gbt_var_consistent(GBT_VARKEY_R* key, const void* query, StrategyNumber strategy, Oid collation,
    bool is_leaf, const gbtree_vinfo* tinfo);

extern GIST_SPLITVEC* gbt_var_picksplit(
    const GistEntryVector* entryvec, GIST_SPLITVEC* v, Oid collation, const gbtree_vinfo* tinfo);

extern void gbt_var_bin_union(Datum* u, GBT_VARKEY* e, Oid collation, const gbtree_vinfo* tinfo);

#endif
